#include <stdio.h>
#include <assert.h>
#include <stdlib.h>

typedef int LDataType;

// 链表结构体
typedef struct Node
{
    LDataType data;
    struct Node *next;
} Node, *List;

// 接口函数
List BuyNewNode(LDataType data);                  // 动态生成新节点
void InitLinklist(List *pL);                      // 初始化单链表
void PushFrontLinklist(List *pL, LDataType data); // 头插
void PrintLinklist(List L);                       // 打印单链表

List BuyNewNode(LDataType data) // 生成新节点
{
    List NewNode = (List)malloc(sizeof(Node));
    NewNode->data = data;
    NewNode->next = NULL;
    return NewNode;
}
void InitLinklist(List *pL) // 初始化
{
    // 如果它的条件返回错误，则终止程序执行
    assert(pL != NULL);
    (*pL) = NULL;
}
void PushFrontLinklist(List *pL, LDataType data) // 头插
{
    assert(pL != NULL);
    List NewNode = BuyNewNode(data);
    if (*pL == NULL)
    {
        *pL = NewNode;
        return;
    }
    NewNode->next = *pL;
    *pL = NewNode;
}

void PrintLinklist(List L) // 打印单链表
{
    while (L)
    {
        printf("%d-->", L->data);
        L = L->next;
    }
}
List addTwoNumbers(List l1, List l2)
{
    List head = NULL, tail = NULL;
    int carry = 0;
    while (l1 || l2)
    {
        int n1 = l1 ? l1->data : 0;
        int n2 = l2 ? l2->data : 0;
        int sum = n1 + n2 + carry;
        if (!head)
        {
            head = tail = (List)malloc(sizeof(Node));
            tail->data = sum % 10;
            tail->next = NULL;
        }
        else
        {
            tail->next = (List)malloc(sizeof(Node));
            tail->next->data = sum % 10;
            tail = tail->next;
            tail->next = NULL;
        }
        carry = sum / 10;
        if (l1)
        {
            l1 = l1->next;
        }
        if (l2)
        {
            l2 = l2->next;
        }
    }
    if (carry > 0)
    {
        tail->next = (List)malloc(sizeof(Node));
        tail->next->data = carry;
        tail->next->next = NULL;
    }
    return head;
}

int main()
{
    List first = NULL;
    List first2 = NULL;
    List first3 = NULL;
    InitLinklist(&first2);
    InitLinklist(&first);         // 初始化
    PushFrontLinklist(&first, 6); // 头插元素
    PushFrontLinklist(&first, 7);
    PushFrontLinklist(&first, 8);
    PushFrontLinklist(&first2, 9);
    PushFrontLinklist(&first2, 10);
    PrintLinklist(first);
    printf("\n");
    PrintLinklist(first2);
    printf("\n");
    first3 = addTwoNumbers(first, first2);
    PrintLinklist(first3);
    return 0;
}